package elementRegulation;

import java.util.ArrayList;
import java.util.Random;
import semaphore.Semaphore;
import semaphore.Rouge;
import semaphore.Vert;
import train.Train;
import jonctions.Aiguillage;
import capteur.Capteur;

public class ElementRegulation1 extends ElementRegulation{

	private Capteur[] capteurs;
	private Semaphore[] semaphores;
	private int nbBrancheAiguillage;
	private int amont;
	private int aval;
	private int idTrain;
	private Aiguillage ai;
	
	public ElementRegulation1(Aiguillage ai) {
		this.ai = ai;
		nbBrancheAiguillage = ai.getListRail().size();
		capteurs= new Capteur[nbBrancheAiguillage];
		semaphores= new Semaphore[nbBrancheAiguillage];
		for(int i=0; i<nbBrancheAiguillage; i++){
			/*
			 * pour rail d'aiguillage, on definie listCaptRail.get(0) et
			 * listSemaphoreRail.get(0) sont le capteur et la semaphore pour aiguillage
			 */
			capteurs[i] = ai.getListRail().get(i).getListCaptRail().get(0);
			semaphores[i] = ai.getListRail().get(i).getListSemaphoreRail().get(0);
			semaphores[i].setEtat(new Rouge());
		}
	}

	
	@Override
	public void execute(ArrayList<Train> listTrains) {
		boolean toutRouge = true;
		for(int i = 0; i < nbBrancheAiguillage; i++){
			toutRouge = toutRouge && (semaphores[i].getEtat().getCouleur().equals("rouge"));
		}
		
		/* si toutes les semaphores sont en rouge, ca veut dire l'aiguillage n'est pas occupee */
		if (toutRouge) {
			for (int i = 0; i < nbBrancheAiguillage; i++) {
				for (int j = 0; j < listTrains.size(); j++) {
					/*
					 * le train listTrains.get(j) est presente dans le
					 * nbBrancheAiguillage i
					 */
					if ((capteurs[i].testePresenceTrain(listTrains.get(j)
							.getPositionTete()))
							&& (listTrains
									.get(j)
									.getListRailTrain()
									.get(listTrains.get(j).getListRailTrain()
											.size() - 1).getIdRail() == ai
									.getListRail().get(i).getIdRail())) {

						idTrain = listTrains.get(j).getId();
						/* choisit la branche d'aiguillage numero r pour l'aval */
						Random random = new Random();
						while (true) {
							int r = random.nextInt(nbBrancheAiguillage);
							if (r != i) {
								boolean bool = false;
								for (int k = 0; k < listTrains.size(); k++) {
									if ((capteurs[r]
											.testePresenceTrain(listTrains.get(
													k).getPositionTete()))
											&& (listTrains
													.get(k)
													.getListRailTrain()
													.get(listTrains.get(k)
															.getListRailTrain()
															.size() - 1)
													.getIdRail() == ai
													.getListRail().get(r)
													.getIdRail())) {
										bool = true;
									}
								}
								/* si y a pas de train dans le rail on a chosis, on met ce rail a aval*/
								if (bool == false) {
									semaphores[i].setEtat(new Vert());
									ai.setAmont(ai.getListRail().get(i));
									amont = i;
									semaphores[r].setEtat(new Vert());
									ai.setAval(ai.getListRail().get(r));
									aval = r;
									break;
								}
							}
						}

					}

				}
			}
		}
		
		/* si ce n'est pas toutRouge, ca veut dire y a un train qui est en train de passer l'aiguillage*/
		else {
			/*
			 * le dernier de wagon de train qui est en train de passer
			 * l'aiguillage est dans la position de capteur de presence de rail
			 * amont d'aiguillage
			 */
			if ((capteurs[amont].testePresenceTrain(listTrains.get(idTrain)
					.getPositionQueu()))
					&& (listTrains.get(idTrain).getListRailTrain().get(0)
							.getIdRail() == ai.getListRail().get(amont)
							.getIdRail())) {
				semaphores[amont].setEtat(new Rouge());
				semaphores[aval].setEtat(new Rouge());
			}
		}
	}

}
